import java.util.*;
/**
 * Clase de los objetos del tipo gancho, el cual contiene el comportamiento de
 * estos elementos en el mundo de la simulación. Hereda de Attachable Element
 * @author Benjamin
 * @version 2
 */
public class FixedHook extends AttachableElement {
   private static int id=0;
   private Vector2D pos_t;     // current position at time t
   private Vector<Spring> springs;  // Vector can grow, arrays cannot. 
   private Vector<RubberBand> rubbers;  // Vector can grow, arrays cannot. 
   /**
    * Constructor del gancho.
    */
   private FixedHook(){   // nobody can create a block without state
     super(id++);
   }
   /**
    * Constructor del gancho con posición indicada.
    * @param pos vector de posición.
    */
   public FixedHook(Vector2D pos){
      super(id++);
      pos_t = pos;
      springs = new Vector<Spring>();
      rubbers = new Vector<RubberBand>();
   }
   /**
    * Función para acoplar un extremo de un resorte.
    * @param spring resorte a acoplar.
    */
   public void attachSpring (Spring spring) {
     springs.add(spring);
   }
   /**
    * Función para desacoplar un extremo de un resorte.
    * @param spring resorte a desacoplar.
    */
   public void detachSpring (Spring spring) {
     springs.remove(spring);
   }
   /**
    * Función para acoplar un extremo de un elástico.
    * @param rubber elástico a acoplar.
    */
   public void attachRubber (RubberBand rubber) {
     rubbers.add(rubber);
   }
   /**
    * Función para desacoplar un extremo de un resorte.
    * @param rubber elástico a desacoplar.
    */
   public void detachRubber (RubberBand rubber) {
     rubbers.remove(rubber);
   }
   /**
    * Función que obtiene el vector de posición del gancho.
    * @return vector de posición
    */
   public Vector2D getPosition() {
      return pos_t;
   }
   /**
    * Función que entrega la coordenada X de la posición del gancho.
    * @return coordenada X.
    */
   public double getX() {
      return pos_t.getX();
   }
   /**
    * Función que entrega la coordenada Y de la posición del gancho.
    * @return coordenada Y.
    */
   public double getY() {
      return pos_t.getY();
   }
   /**
    * Función que establece la posición del gancho.
    * @param x coordenada X.
    * @param y coordenada Y.
    */
   public void setPosition(int x, int y){
      pos_t.set(x,y);
   }
   /**
    * Función que entrega la descrición del gancho y su posición.
    * @return string con la descripción del gancho y su posición.
    */
   public String getDescription() {
      return "FixedHook_" + getId()+":"+pos_t.getDescription();
   }
   /**
    * Función que entrega el estado de la posición del gancho.
    * @return string con el estado de la posición del gancho
    */
   public String getState() {
      return getPosition()+"";
   }
}
